# git 基本操作和分支操作

# 一、基本操作

# 版本控制

首先理解一下版本控制,版本控制是一种记录若干个文件变化内容,以便将来查阅特定版本修订情况的系统。

# 创建版本库

可以将其理解为一个目录,这个目录里所有文件都可以被管理,所有文件的修改,删除,git 都可以跟踪,以便将来追踪历史,因而也可以还原。


mkdir folderName # 这样就创建了一个 folderName 文件夹

cd folderName # 这样就打开了文件夹

pwd # 显示当前目录
1
2
3
4
5
6

# 将当前目录变为 git 可管理的仓库

git init
1

# 在当前文件夹中创建文件

直接新建 txt 文件。

# 把文件添加到版本库

把文件放到 git  仓库需要两步

git add filename # 包括文件后缀,将文件添加到暂存区。

git commit -m "这里面的内容是说明" # 用命令 git commit 告诉 git,将文件添加到仓库,将暂存区添加到当前分支。
1
2
3

# 查看仓库当前状态

git status
1

# 查看具体修改的内容

git diff + filename
1

# 显示提交日志

git log
1

# 版本号

commit id 不是递增的数字,是根据 SHA1 计算出来的一个非常大的数字,用十六进制表示,每提交一个新版本,git 将其自动串成一条时间线。

HEAD 表示当前版本,HEAD^ 表示当前版本的上一版本,HEAD^^ 表示当前版本的上两版本,往上数 100 个版本呢,不可能写一百个 ^,因此存在另一种方法为 HEAD~100

# 版本回退

git 内部有一个指向当前版本的 HEAD 指针,回退的时候,指针就指向需要回退的那个版本去了。

git reset --hard HEAD^ # 会退到上一版本
git reset --hard + 版本号 # 就会来到版本号的那个版本
1
2

# 记录每一次命令

git reflog
1

# 名词解释

Changes to be committed 已暂存状态 还没到分区

modified: readme.txtreadme.txt 这个文件被修改过了

nothing to commit, working tree clean 没有需要提交的

Changes not staged for commit 还没到暂存区

Untracked files 未被添加的文件

Fast-forward 快进模式

工作区: 电脑上能看到的目录。

版本库: 工作区的隐藏目录 .git,这个不是工作区,而是 git 的版本库

暂存区: stage 或者 叫做 index mastergit 为我们自动创建的第一个分支。

# 查看工作区与版本库最新版本的区别

git diff HEAD -- 文件名 # 注意-- 与文件名之间有空格
1

# 提交的理解

第一次修改然后 git add 即将文件添加到暂存区中

第二次修改了然后直接 git commit -m 将暂存区的文件提交到分区里,那么分区里是不会有第二次修改的内容。

为什么呢?因为 git commit -m 是把暂存区里的文件提交到分区里,而第二次修改的内容没有在暂存区里。

# 提交的顺序

  1. 先手动修改文件
  2. 查看当前状态
  3. 查看修改的与之前的版本有何差别
  4. 添加到暂存区
  5. 将暂存区的文件添加到分区

# 丢弃工作区的修改

git checkout -- file # -- 非常重要,不要漏掉
1

这边需要分两种情况

  1. 文件修改后未添加到暂存区中,撤销修改就回到未修改的情况。
  2. 文件修改后并且添加到暂存区后再次修改(第二次修改了),撤销修改就把第二次修改撤销了,回到添加到暂存区的状态。

# 丢弃暂存区的修改

git reset HEAD file 将暂存区的修改撤销掉重新放回工作区,但是工作区现在被修改了,所以我们需要再一次丢弃工作区的修改 git checkout -- file

# 删除文件

rm filename # 工作区的删除但是版本库里面还有
1

# 从版本库中删除

git rm test.txt
1

# 从版本库中恢复到工作区

git checkout -- test.txt
git checkout 就是用版本库的内容覆盖工作区的内容。
1
2

# 将本地的仓库与远程的关联

git remote add origin git@github.com:stevenling/learngit.git
1

# 第一次将本地库的内容推送到远程库上

git push -u origin master # master 是当前分支名
1

# 以后本地直接提交

git push origin master
1

# 克隆仓库

需知道仓库的地址,常用。

git clone git@github.com:torvalds/linux.git
1

# 二、分支

# 创建与合并分支

每次提交,git 把它们串成一条时间线,这条时间线就是分支。

目前只有一个主分支,即 master 分支。HEAD 不是指向提交,而是指向 master 分支,master 指向提交,HEAD 指向的就是当前分支。

当我们创建一个新的分支,例如 dev 时,git 新建了一个指针 dev 指向和 master 一样的提交,就是 dev 与 master 共同指向一个相同的提交,然后让 HEAD 指向 dev,就表示当前分支在 dev 上面了。

从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一下,dev 指针往前移动一步,master 原地不动。 合并就让 master 指向完成一切操作的 dev 的当前提交。

合并完,也可以删除 dev 分支。

# 创建并切换分支

git checkout -b dev # dev 是分支名

# 相当于以下两条命令
git branch dev # 创建分支
git checkout dev # 切换分支
1
2
3
4
5

# 查看当前分支

git branch # 会列出所有分支,当前分支前面有*号
1

# 合并指定分支到当前分支

git merge dev # dev 是指定分支名
1

# 删除分支

git branch -d dev # dev 是要被删除的分支名
1